package ca.qc.bdeb.jeuxdesboites.model;

import ca.qc.bdeb.jeuxdesboites.commun.Coup;
import ca.qc.bdeb.jeuxdesboites.commun.EvenementPartie;
import ca.qc.bdeb.jeuxdesboites.commun.IDJoueurs;
import ca.qc.bdeb.mvc.Observateur;
import java.util.List;
import java.util.Random;

/**
 *
 * @author Eric Wenaas <eric.wenaas@bdeb.qc.ca>
 */
class JoueurArtificiel extends Joueur implements Observateur {

    private GestionPartie partie;
    Thread analyse;
    Random generator;
    AnalyseAI algorithme = new MiniMax();

    JoueurArtificiel(GestionPartie partie) {
        super();
        setNom("Ordinateur");
        this.partie = partie;
        long seed = System.currentTimeMillis();
        generator = new Random(seed);
        System.out.println("Random seed: " + seed);
    }

    JoueurArtificiel(GestionPartie partie, long seed) {
        this(partie);
        generator = new Random(seed);
    }

    private void jouerCoup() {
        analyse = new Thread(new Runnable() {
            @Override
            public void run() {
                TableauJeu copieTableau = (TableauJeu) partie.getTableau().clone();
                Coup leCoup = determinerCoup(copieTableau);
                partie.jouerCoup(IDJoueurs.JOUEUR_ARTIFICIEL, leCoup);
            }
        });
        analyse.start();
    }

    Coup determinerCoup(TableauJeu tableau) {
        List<Coup> coupsCandidat = algorithme.analyserPosition(tableau);
        int nombreCoups = coupsCandidat.size();
        int value = generator.nextInt(nombreCoups);
        return coupsCandidat.get(value);
    }

    @Override
    public void changementEtat() {
    }

    @Override
    public void changementEtat(Enum<?> property, Object o) {
        if (property.equals(EvenementPartie.CHANGEMENT_TABLEAU)) {
        } else if (property.equals(EvenementPartie.COUPS_REQUIS)) {
            if (partie.getJoueurActuel().equals(IDJoueurs.JOUEUR_ARTIFICIEL)) {
                jouerCoup();
            }
        }
    }
}
